package org.example.nettydemo.netty.customize;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.charset.Charset;
import java.util.List;

/**
 * @author liujing
 */
public class CustomizeDecoder extends ByteToMessageDecoder {
    private static final Logger logger = LoggerFactory.getLogger(CustomizeDecoder.class);

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        // 1️⃣ 打印收到的原始数据（以十六进制格式）
        String hexDump = ByteBufUtil.hexDump(byteBuf);
        logger.info("🔹 原始数据（Hex）: {}", hexDump);

        // 2️⃣ 检查是否有足够的数据来读取长度字段
        if (byteBuf.readableBytes() < 2) {
            logger.warn("❌ 数据不足，等待更多数据...");
            return;
        }

        // 3️⃣ 标记当前读索引，以便解析失败时回滚
        byteBuf.markReaderIndex();

        // 4️⃣ 读取 2 字节的长度
        short length = byteBuf.readShort();
        logger.info("📏 解析出的长度字段: {}", length);

        // 5️⃣ 确保剩余可读字节 >= length，否则回滚并等待更多数据
        if (byteBuf.readableBytes() < length) {
            logger.warn("❌ 数据不完整，等待更多数据...");
            byteBuf.resetReaderIndex();
            return;
        }

        // 6️⃣ 读取消息内容
        byte[] bytes = new byte[length];
        byteBuf.readBytes(bytes);
        String content = new String(bytes, Charset.forName("UTF-8"));

        // 7️⃣ 打印最终解析的内容
        logger.info("📜 解析出的内容: {}", content);

        // 8️⃣ 传递解析后的消息给下一个 Handler
        list.add(content);


    }
}
